package middleware

import (
	"strings"

	"gitee.com/wangshh_123/cross-pay-go/src/utils/common"
	"github.com/gin-gonic/gin"
)

// TimeZoneMiddleware 时区中间件
func TimeZoneMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头获取时区信息
		timezone := c.GetHeader("X-Timezone")
		if timezone == "" {
			// 从Accept-Language推断时区
			acceptLang := c.GetHeader("Accept-Language")
			timezone = inferTimezoneFromLanguage(acceptLang)
		}

		// 验证时区是否有效
		if timezone != "" {
			if err := common.ValidateTimeZone(timezone); err != nil {
				// 时区无效，使用默认时区
				timezone = common.GetTimeZone().DefaultTimeZone
			}
		} else {
			// 没有指定时区，使用默认时区
			timezone = common.GetTimeZone().DefaultTimeZone
		}

		// 将时区信息存储到上下文中
		c.Set("user_timezone", timezone)
		c.Next()
	}
}

// inferTimezoneFromLanguage 从语言推断时区
func inferTimezoneFromLanguage(acceptLang string) string {
	if acceptLang == "" {
		return ""
	}

	// 解析Accept-Language头
	languages := strings.Split(acceptLang, ",")
	if len(languages) == 0 {
		return ""
	}

	// 获取主要语言
	primaryLang := strings.TrimSpace(strings.Split(languages[0], ";")[0])
	primaryLang = strings.ToLower(primaryLang)

	// 语言到时区的映射
	langToTimezone := map[string]string{
		"zh-cn": "Asia/Shanghai",
		"zh-tw": "Asia/Taipei",
		"zh-hk": "Asia/Hong_Kong",
		"zh-sg": "Asia/Singapore",
		"en-us": "America/New_York",
		"en-gb": "Europe/London",
		"en-au": "Australia/Sydney",
		"en-ca": "America/Toronto",
		"ja":    "Asia/Tokyo",
		"ko":    "Asia/Seoul",
		"th":    "Asia/Bangkok",
		"vi":    "Asia/Ho_Chi_Minh",
		"id":    "Asia/Jakarta",
		"ms":    "Asia/Kuala_Lumpur",
		"fr":    "Europe/Paris",
		"de":    "Europe/Berlin",
		"it":    "Europe/Rome",
		"es":    "Europe/Madrid",
		"pt":    "Europe/Lisbon",
		"ru":    "Europe/Moscow",
		"ar":    "Asia/Riyadh",
		"hi":    "Asia/Kolkata",
		"tr":    "Europe/Istanbul",
		"pl":    "Europe/Warsaw",
		"nl":    "Europe/Amsterdam",
		"sv":    "Europe/Stockholm",
		"no":    "Europe/Oslo",
		"da":    "Europe/Copenhagen",
		"fi":    "Europe/Helsinki",
		"cs":    "Europe/Prague",
		"hu":    "Europe/Budapest",
		"ro":    "Europe/Bucharest",
		"bg":    "Europe/Sofia",
		"hr":    "Europe/Zagreb",
		"sk":    "Europe/Bratislava",
		"sl":    "Europe/Ljubljana",
		"et":    "Europe/Tallinn",
		"lv":    "Europe/Riga",
		"lt":    "Europe/Vilnius",
		"mt":    "Europe/Malta",
		"el":    "Europe/Athens",
		"he":    "Asia/Jerusalem",
		"fa":    "Asia/Tehran",
		"ur":    "Asia/Karachi",
		"bn":    "Asia/Dhaka",
		"si":    "Asia/Colombo",
		"my":    "Asia/Yangon",
		"km":    "Asia/Phnom_Penh",
		"lo":    "Asia/Vientiane",
		"ne":    "Asia/Kathmandu",
		"mn":    "Asia/Ulaanbaatar",
		"ka":    "Asia/Tbilisi",
		"hy":    "Asia/Yerevan",
		"az":    "Asia/Baku",
		"kk":    "Asia/Almaty",
		"ky":    "Asia/Bishkek",
		"tg":    "Asia/Dushanbe",
		"tk":    "Asia/Ashgabat",
		"uz":    "Asia/Tashkent",
		"af":    "Africa/Johannesburg",
		"sw":    "Africa/Nairobi",
		"am":    "Africa/Addis_Ababa",
		"so":    "Africa/Mogadishu",
		"yo":    "Africa/Lagos",
		"ig":    "Africa/Lagos",
		"ha":    "Africa/Lagos",
		"zu":    "Africa/Johannesburg",
		"xh":    "Africa/Johannesburg",
		"st":    "Africa/Maseru",
		"sn":    "Africa/Harare",
		"ny":    "Africa/Blantyre",
		"mg":    "Indian/Antananarivo",
		"rw":    "Africa/Kigali",
		"rn":    "Africa/Bujumbura",
		"lg":    "Africa/Kampala",
		"ak":    "Africa/Accra",
		"tw":    "Africa/Lagos",
		"ff":    "Africa/Dakar",
		"wo":    "Africa/Dakar",
		"bm":    "Africa/Bamako",
		"dy":    "Africa/Ouagadougou",
		"sg":    "Africa/Brazzaville",
		"ln":    "Africa/Kinshasa",
		"pt-br": "America/Sao_Paulo",
		"es-mx": "America/Mexico_City",
		"es-ar": "America/Argentina/Buenos_Aires",
		"es-cl": "America/Santiago",
		"es-co": "America/Bogota",
		"es-pe": "America/Lima",
		"es-ve": "America/Caracas",
		"es-ec": "America/Guayaquil",
		"es-bo": "America/La_Paz",
		"es-py": "America/Asuncion",
		"es-uy": "America/Montevideo",
		"es-gt": "America/Guatemala",
		"es-hn": "America/Tegucigalpa",
		"es-ni": "America/Managua",
		"es-cr": "America/Costa_Rica",
		"es-pa": "America/Panama",
		"es-do": "America/Santo_Domingo",
		"es-cu": "America/Havana",
		"es-pr": "America/Puerto_Rico",
		"fr-ca": "America/Montreal",
		"en-in": "Asia/Kolkata",
		"en-za": "Africa/Johannesburg",
		"en-nz": "Pacific/Auckland",
		"en-ie": "Europe/Dublin",
		"en-sg": "Asia/Singapore",
		"en-my": "Asia/Kuala_Lumpur",
		"en-ph": "Asia/Manila",
		"en-pk": "Asia/Karachi",
		"en-bd": "Asia/Dhaka",
		"en-lk": "Asia/Colombo",
		"en-ke": "Africa/Nairobi",
		"en-ug": "Africa/Kampala",
		"en-tz": "Africa/Dar_es_Salaam",
		"en-gh": "Africa/Accra",
		"en-ng": "Africa/Lagos",
		"en-zw": "Africa/Harare",
		"en-bw": "Africa/Gaborone",
		"en-na": "Africa/Windhoek",
		"en-mw": "Africa/Blantyre",
		"en-zm": "Africa/Lusaka",
		"en-mz": "Africa/Maputo",
	}

	if tz, exists := langToTimezone[primaryLang]; exists {
		return tz
	}

	// 如果没有找到匹配的语言，返回空字符串
	return ""
}

// GetUserTimezone 从上下文获取用户时区
func GetUserTimezone(c *gin.Context) string {
	if tz, exists := c.Get("user_timezone"); exists {
		if timezone, ok := tz.(string); ok {
			return timezone
		}
	}
	return common.GetTimeZone().DefaultTimeZone
}

// SetUserTimezone 设置用户时区到上下文
func SetUserTimezone(c *gin.Context, timezone string) {
	c.Set("user_timezone", timezone)
}
